package top.kiterunner.learning.concurrency_test;

import java.util.concurrent.TimeUnit;

/**
 * AdorynZhao in Tencent-UESTC.
 * Source Code Created on 2017/7/3.
 * 问题：一个同步方法能否可以调用另一个同步方法，一个线程已经拥有某个对象的锁，再次申请的时候是否仍然会得到该对象的锁。
 * 即synchronized获得的锁是否可重入？？？
 */
public class ThreadDemo4 {

    public synchronized void method1() {
        System.out.println("Method M1 Start....");
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        method2();
        System.out.println("Method M1 Ending...");
    }

    public synchronized void method2() {
        System.out.println("Method M2 Start...");
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Method M2 Ending...");
    }

    // 答案：一个同步方法可以调用另一个同步方法，一个线程已经拥有某个对象的锁，再次申请的时候仍然会得到该对象的锁，即同一个线程获得的锁可重入。
    public static void main(String[] args) {
        ThreadDemo4 t4 = new ThreadDemo4();
        new Thread(()->t4.method1(), "T1").start();
    }
}
